DerbyGeneratedKeysReader.java

package org.codefilarete.stalactite.sql;

import java.sql.SQLException;
import java.util.List;

import org.codefilarete.stalactite.sql.DerbyDatabaseSettings.DerbyWriteOperation;
import org.codefilarete.stalactite.sql.statement.GeneratedKeysReader;
import org.codefilarete.stalactite.sql.statement.WriteOperation;
import org.codefilarete.stalactite.sql.statement.binder.DefaultParameterBinders;
import org.codefilarete.tool.collection.Iterables;

/**
 * @author Guillaume Mary
 */
public class DerbyGeneratedKeysReader extends GeneratedKeysReader<Integer> {
	
	/**
	 * Constructor
	 */
	public DerbyGeneratedKeysReader() {
		// Derby doesn't support named column for generated key, we use "1" assuming this is used for autoincremented id
		super("1", DefaultParameterBinders.INTEGER_PRIMITIVE_BINDER);
	}
	
	/** Overridden to simulate generated keys for Derby because it only returns the highest generated key */
	@Override
	public List<Integer> convert(WriteOperation writeOperation) throws SQLException {
		List<Integer> rows = super.convert(writeOperation);
		// Derby only returns one row: the highest generated key
		int first = Iterables.first(rows);
		// we append the missing values in incrementing order, assuming that's a one by one increment
		for (int i = 0; i < ((DerbyWriteOperation) writeOperation).getUpdatedRowCount(); i++) {
			rows.add(0, first - i);
		}
		return rows;
	}
}